package com.topisv.tms.repository.task.interfacetask;

import java.util.Date;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;

import com.topisv.tms.entity.interfacetask.InterfaceTask;

/**
 * 接口任务，用于反馈报文 
 * @author <a href="mailto:yuanlianghe@nryuncang.com">yuanlianghe</a>
 * @since 0.0.10
 */
public interface InterfaceTaskDao extends PagingAndSortingRepository<InterfaceTask, Long>, JpaSpecificationExecutor<InterfaceTask> {

    
    /**
     * 锁定任务
     * 
     * @param node 节点
     * @param type 任务类型
     * @param status 任务状态
     * @param maxRows 最大行数
     * @return affected rows
     */
    @Query(nativeQuery=true, value="update interface_task set node=?1 where status=?2 and node='-' order by id limit ?3")
    @Modifying
    int lockTask(String node, String status, int maxRows);
    
    @Query("select count(t.id) from InterfaceTask t where t.id=?1 and t.status=?2")
    long  countNotProcess(Long taskId, String status);

    /**
     * 查找需要处理的任务
     * 
     * @param status 任务状态, should be 'READY' or ('ERROR' AND retryTimes<n)
     * @param node 分片节点
     * @param retryTimes 尝试次数
     * @param pageable 分页参数
     * @return 任务集合
     */
    @Query("from InterfaceTask t where t.status=?1 and t.node=?2 and t.retryTimes=?3 order by t.id")
    Page<InterfaceTask> queryTask(String status, String node, int retryTimes, Pageable pageable);
    
    /**
     * 更新任务状态
     * <p>注：参数：<code>retryTimes</code>一般来说应该传值为1。
     * 
     * @param id 任务ID
     * @param status 任务状态
     * @param errorWho 错误归属方
     * @param errorMsg 错误消息
     * @param updatedTime 更新时间
     * @param retryTimes 本次尝试次数
     * @return affected rows
     */
    @Query("update InterfaceTask t set t.status=?2, t.errorWho=?3, t.errorMsg=?4, t.updatedTime=?5, t.retryTimes=t.retryTimes+?6 where t.id=?1")
    @Modifying
    int updateTask(Long id, String status, String errorWho, String errorMsg, Date updatedTime, int retryTimes);
    
    /**
     * 更具能容订单号修改task状态(可能一次多条)
     *
     * @param 
     * @return 
     * @throws 
     * @author yuansheng
     * @version 1.0.0
     */
    @Query("update InterfaceTask t set t.status=?2 where t.relatedNo=?1 AND t.type=?3")
    @Modifying
    int updateStatusByRelateNoAndType(String relatedNo, String status, String type);
    
}
